package date;


import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 解决多线程并发， 及 Synchronized 并发量大的时候会对性能有影响，线程阻塞。
 *  和方法中 不停创建 SimpleDateFormat 对象带来的性能影响
 */
public class DateFUtils {

    // 方式一
    private static  ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {

        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        }
    };


    public static Date  parse (String dateStr) throws ParseException {
        return threadLocal.get().parse(dateStr);
    }


    public static String format (Date date) {
        return threadLocal.get().format(date);
    }

    // 方式二

    //=================================================================//
    //   java8+ : DateTimeFormatter 他的类是不可变的，并且是线程安全的。  //
    //=================================================================//

    private static  DateTimeFormatter datetimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    public static String formatter (LocalDateTime date){
        return datetimeFormatter.format(date);
    }

    /**
     * @param dateStr
     * @return LocalDateTime
     */
    public static LocalDateTime formatter(String dateStr){
        return LocalDateTime.parse(dateStr, datetimeFormatter);
    }

    /**
     * @param dateStr
     * @return LocalDate
     */
    public static LocalDate formatter1(String dateStr){
        return LocalDate.parse(dateStr, datetimeFormatter);
    }

    /**
     * @param dateStr
     * @return LocalDate
     */
    public static LocalTime formatter2(String dateStr){
        return LocalTime.parse(dateStr, datetimeFormatter);
    }

}
